package justcents.game.sticks;

import java.util.ArrayList;
import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.InputFilter.LengthFilter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class PartidaOfflineActivity extends Activity {
	
	private final Integer CS_ESCOLHA_PALITOS_NA_MAO = 1;
	private final Integer CS_ESCOLHA_PALPITE = 2;
	
	private PartidaOffline obPartidaOffline;
	
	private ArrayList<TextView> arNmJogador = new ArrayList<TextView>();
	private ArrayList<TextView> arNrAposta = new ArrayList<TextView>();
	private ArrayList<TextView> arStStatus = new ArrayList<TextView>();
	private ArrayList<TextView> arStTabela = new ArrayList<TextView>();
	private ArrayList<TextView> arNrPontos = new ArrayList<TextView>();
	private ArrayList<Integer> ListaIndex;
	
	protected static final int STATUS_BOT = 1;
	private Handler handler = new JogadorBotMsg();
	
	private Button btEscolhaPalitos;
	private Button btEscolhaPalpite;
	private Button btProximaRodada;
	
	@Override
	public void onCreate(Bundle icicle){
		super.onCreate(icicle);
		setContentView(R.layout.partidaoffline);
		
		//Instanciar nova partida offline
		this.obPartidaOffline = new PartidaOffline();
		//Limpando Tela
		this.initTela();
		
		this.btProximaRodada = (Button) findViewById(R.id.btProximaRodada);
		this.btProximaRodada.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});
	
		//Botão para escolha de palitos na mão
		this.btEscolhaPalitos = (Button) findViewById(R.id.btEscolhaPalitos);
		this.btEscolhaPalitos.setOnClickListener(new OnClickListener() {
		
			@Override
			public void onClick(View v) {
				Intent it = new Intent(PartidaOfflineActivity.this, EscolhaPalitosActivity.class);
				Bundle params = new Bundle();
				params.putInt("nrTotalPalitos", obPartidaOffline.getLstJogadores().get(0).getNrTotalPalitos());
				it.putExtras(params);
				startActivityForResult(it, 1);
			}
		});
		
		//Botão para arriscar um palpite. 
		//Só é habilitado depois que todos os jogadores colocam palitos na mão.
		this.btEscolhaPalpite = (Button) findViewById(R.id.btEscolhaPalpite);
		this.btEscolhaPalpite.setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View v) {
						ArrayList<Integer> arNumerosEscolhidos = new ArrayList<Integer>();
						for(Jogador obJogador : obPartidaOffline.getLstJogadores()){
							if(obJogador.getNrPalpite() != null){
								arNumerosEscolhidos.add(obJogador.getNrPalpite());
							}
						}
						Intent it = new Intent(PartidaOfflineActivity.this, EscolhaPalpiteActivity.class);
						Bundle params = new Bundle();
						params.putInt("nrTotalPalitosNaMesa", obPartidaOffline.getNrTotalPalitosNaMesa());
						params.putIntegerArrayList("arNumerosEscolhidos", arNumerosEscolhidos);
						it.putExtras(params);
						startActivityForResult(it, 2);
					}
				});
	}
	
	protected void onStop() {
		super.onStop();
	}
	
	protected void onStart() {
		super.onStart();
	}
	
	protected void onResume() {
		super.onResume();
	}
	
	private void initTela(){

		//Nome do Jogador na Tela
		arNmJogador.add((TextView) findViewById(R.id.stNmP1));
		arNmJogador.add((TextView) findViewById(R.id.stNmP2));
		arNmJogador.add((TextView) findViewById(R.id.stNmP3));
		arNmJogador.add((TextView) findViewById(R.id.stNmP4));
		
		//Valor da Aposta na Tela
		arNrAposta.add((TextView) findViewById(R.id.stApostaP1));
		arNrAposta.add((TextView) findViewById(R.id.stApostaP2));
		arNrAposta.add((TextView) findViewById(R.id.stApostaP3));
		arNrAposta.add((TextView) findViewById(R.id.stApostaP4));
		
		//Estado do Jogador (Escolha ou Pronto)
		arStStatus.add((TextView) findViewById(R.id.tvStatusP1));
		arStStatus.add((TextView) findViewById(R.id.tvStatusP2));
		arStStatus.add((TextView) findViewById(R.id.tvStatusP3));
		arStStatus.add((TextView) findViewById(R.id.tvStatusP4));
		
		//Titulos da Tabela
		arStTabela.add((TextView) findViewById(R.id.rwNmP1));
		arStTabela.add((TextView) findViewById(R.id.rwNmP2));
		arStTabela.add((TextView) findViewById(R.id.rwNmP3));
		arStTabela.add((TextView) findViewById(R.id.rwNmP4));
		
		//Pontuação dos Jogadores na Tabela
		arNrPontos.add((TextView) findViewById(R.id.rwPtP1));
		arNrPontos.add((TextView) findViewById(R.id.rwPtP2));
		arNrPontos.add((TextView) findViewById(R.id.rwPtP3));
		arNrPontos.add((TextView) findViewById(R.id.rwPtP4));
		
		
		//For ListaJogadores
		int i=0;
		for (Jogador jogador : this.obPartidaOffline.getLstJogadores()) {
			arNmJogador.get(i).setText(jogador.getNmJogador());
			arStTabela.get(i).setText(jogador.getNmJogador());
			arNrPontos.get(i).setText(jogador.getNrTotalPalitos().toString());
			arNrAposta.get(i).setText("--");
			arStStatus.get(i).setText("Escolhendo");
			i++;
		}
	}
	
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(resultCode == CS_ESCOLHA_PALITOS_NA_MAO){
			int nrPalitos = data.getExtras().getInt("nrPalitos");
			this.obPartidaOffline.getLstJogadores().get(0).setNrPalitosMao(nrPalitos);
			//Set Status = Pronto
			this.arStStatus.get(0).setText("Pronto");
			colocarPalitosNaMaoBot();
			this.btEscolhaPalitos.setVisibility(View.GONE);
			this.iniciarRodadaDePalpites();
		}
		if(resultCode == CS_ESCOLHA_PALPITE){
			int nrPalpite = data.getExtras().getInt("nrPalpite");
			this.obPartidaOffline.getLstJogadores().get(0).setNrPalpite(nrPalpite);
			this.arNrAposta.get(0).setText(Integer.toString(nrPalpite));
			this.btEscolhaPalpite.setVisibility(View.GONE);
			this.concluirRodadaDePalpites();
		}
	}

	private void colocarPalitosNaMaoBot(){
		int i = 0;
		for (Jogador jogador : this.obPartidaOffline.getLstJogadores()) {
			if(jogador instanceof JogadorBot){
				JogadorBot obJogadorBot = (JogadorBot) jogador;
				obJogadorBot.escolhePalitosMao();
				Message msg = new Message();
				msg.what = STATUS_BOT;
				Random geradorNum = new Random();
				int nrTempo = geradorNum.nextInt(6) * 1000;
				handler.sendMessageDelayed(msg, nrTempo);
				msg.arg1=i;
			}
			i++;
		}
	}
	
	private void iniciarRodadaDePalpites(){
		int aux = this.obPartidaOffline.getIdJogadorDaVez();
		Integer[] nrPalpites = new Integer[3];
		while(aux != 0){
			JogadorBot obJogadorBot = (JogadorBot) this.obPartidaOffline.getLstJogadores().get(aux);
			Integer nrPalpite = obJogadorBot.escolhePalpite(nrPalpites, this.obPartidaOffline.getNrTotalPalitosNaMesa());
			obJogadorBot.setNrPalpite(nrPalpite);
			nrPalpites[aux-1] = nrPalpite;
			this.arNrAposta.get(aux).setText(nrPalpite.toString());
			if(aux != 3){
				aux++;
			}else{
				aux = 0;
			}
		}
		this.btEscolhaPalpite.setVisibility(View.VISIBLE);
	}

	private void concluirRodadaDePalpites(){
		Integer[] nrPalpites = new Integer[4];
		for(int i = 0; i < 4; i++){
			Integer nrPalpite = this.obPartidaOffline.getLstJogadores().get(i).getNrPalpite(); 
			if(nrPalpite != null){
				nrPalpites[i] = nrPalpite;
			}
		}
		for(int i = 0; i < 4; i++){
			Jogador obJogador = this.obPartidaOffline.getLstJogadores().get(i);
			if(obJogador.getNrPalpite() == null && obJogador instanceof JogadorBot){
				JogadorBot obJogadorBot = (JogadorBot) obJogador;
				Integer nrPalpite = obJogadorBot.escolhePalpite(nrPalpites, this.obPartidaOffline.getNrTotalPalitosNaMesa());
				this.arNrAposta.get(i).setText(nrPalpite.toString());
				obJogadorBot.setNrPalpite(nrPalpite);
				nrPalpites[i] = nrPalpite;
			}
		}
		Integer nrJogadorAcertou = this.obPartidaOffline.verificaSeAlguemAcertou();
		TextView tvJogadorAcertou = (TextView) findViewById(R.id.tvJogadorAcertou);
		tvJogadorAcertou.setVisibility(View.VISIBLE);
		if(nrJogadorAcertou != null){
			Jogador obJogador = this.obPartidaOffline.getLstJogadores().get(nrJogadorAcertou);
			tvJogadorAcertou.setText("O jogador " + obJogador.getNmJogador() + " acertou!");
			obJogador.removePalito();
			this.arNrPontos.get(nrJogadorAcertou).setText(obJogador.getNrTotalPalitos().toString());
		}else{
			tvJogadorAcertou.setText("Ninguém acertou! O número de palitos era: " + this.obPartidaOffline.getNrTotalPalitosNasMaos());
		}
		this.obPartidaOffline.passaVezProximoJogador();
		this.btProximaRodada.setVisibility(View.VISIBLE);
	}
	
	private class JogadorBotMsg extends Handler{
		public void handleMessage(Message msg){
			switch (msg.what) {
			case STATUS_BOT:
					arStStatus.get(msg.arg1).setText("Pronto");
				break;
			default:
				break;
			}
		}
	}
}